<?php

/**
 * Class ImpArg.php
 *
 * Class that deals with the storage/management of arguments inserted by groups
 * in the fundamentation stage
 * @author Jose Oliveira <jafo@ua.pt> 2012
 */

class ImpArg{

	private	$improvedArgID;
	private $improvedArg;
	private $edited;
	private $dateHour;
	private $argType;
	private $groupID;
	private $projectID;


	/**
	 * 
	 * @param string $improvedArg
	 * @param integer $argType
	 * @param integer $groupID
	 * @param integer $projectID
	 */
	function __construct($improvedArg, $argType, $groupID, $projectID){

		if(isset($improvedArg)&& isset($argType) && isset($groupID) && isset($projectID)){
			$this->improvedArg=$improvedArg;
			$this->argType=$argType;
			$this->groupID=$groupID;
			$this->projectID=$projectID;
		}

	}

	/**
	 * Method that stores an argumento on the table ImpArg case this is 
	 * not an edtition to a previously made argument​​.
	 * return 0: storing of the question has failed
	 * return 1: improved question stored with success
	 * return 2: the question has been previously entered by the group
	 * @throws Exception
	 * @return integer
	 * 
	 */
	public function addImpArg(){

		if($this->validArg($this->improvedArg, $this->argType, $this->groupID, $this->projectID)){
				

			$conn=new ConnDBUser();
			$conn->connect();    //liga à base de dados com privilégios de utilizador web

			$date=date("Y-m-d H:i:s");
			$arg=mysql_real_escape_string($this->improvedArg);

			$result=mysql_query("insert into impArg(improvedArg, edited, dateHour, argType, groupID, projectID, state)
			values ('$arg', '0', '$date', '" . $this->argType . "', '" . $this->groupID . "', '" . $this->projectID . "', 1)");

			if(!$result){
				throw new Exception("Lamentamos mas ocorreu um erro ao adicionar o seu argumento");
			}

			try{
				$conn->disconnect($result);
				return 1;
			}catch(Exception $e){
				$e->getMessage();
			}

		}else{
			return 2;
		}
	}

	/**
	 * Method that verifies if this argument has not yet been entered by this group 
	 * @param string $impArg
	 * @param integer $argType
	 * @param integer $groupID
	 * @param integer $projectID
	 * @throws Exception
	 * @return bool
	 */
	private function validArg($impArg, $argType, $groupID, $projectID){

		$conn=new ConnDBUser();
		$conn->connect();
		
		$impArg=mysql_real_escape_string($impArg);

		$result=mysql_query("select improvedArgID from impArg where improvedArg='$impArg' and argType='$argType' and groupID='$groupID' and projectID='$projectID' and state='1'");

		if(!$result){
			throw new Exception("Lamentamos mas não foi possível adicionar o argumento");
		}

		try{
			$num=mysql_num_rows($result);
			$conn->disconnect($result);
				
			//se o número de linhas encontradas for maior que 0, então um argumento idêntico a este já foi inserido e então este deve ser invalidado
			if($num==0){
				return true;
			}else{
				return false;
			}
				
		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Method that receives a improved argument ID and returns the respective argument
	 * @param integer $impArgID
	 * @throws Exception
	 * @return string
	 */
	public function getArgByID($impArgID){
		/*
		 *Método que recebendo um id de um argumento, retorna o respetivo argumento
		 */

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select improvedArg from impArg where improvedArgID=$impArgID");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro ao adquirir este elemento");
		}

		try{
				
			$registo=mysql_fetch_array($result);
			$conn->disconnect($result);
			return $registo['improvedArg'];
				
		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Method that gets an argument ID and returns the respective argument topology
	 * (for, against or not in favor or against)
	 * @param integer $argID
	 * @throws Exception
	 * @return integer
	 */
	public function getArgType($argID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select argType from impArg where improvedArgID=$argID");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro ao obter o argumento");
		}

		try{
				
			$registo=mysql_fetch_array($result);
			$conn->disconnect($result);
			return $registo['argType'];
				
		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Method that update de field "edited" of this argument to "1"
	 * @param integer $improvedArgID
	 * @throws Exception
	 * @return bool
	 */
	public function updateToEdited($improvedArgID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("update impArg set edited='1' where improvedArgID='$improvedArgID'");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro");
		}

		try{
			$conn->disconnect($result);
			return true;
		}catch(Exception $e){
			$e->getMessage();
		}

		$conn->disconnect($result);
		return false;
	}


	/**
	 * Method that returns the IDs of all arguments that have been edited
	 * from a certain group. 
	 * @param integer $groupID
	 * @param integer $projectID
	 * @throws Exception
	 * @return array
	 */
	public function edArgIDs($groupID, $projectID){

		$conn=new ConnDBUser();
		$conn->connect();

		//query que selecciona os IDs de todos os argumentos de um dado grupo que sofreram edição
		$result=mysql_query("select improvedArgID from impArg where edited='1' and groupID='$groupID' and projectID='$projectID' and state=1");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro");
		}

		try{
				
			$num=mysql_num_rows($result);

			if($num==0){
				$conn->disconnect($result);
				return 0;           //se não houverem questões editadas, não retornamos nada
			}else{
				$ids=array();

				while($registo=mysql_fetch_array($result)){
					$temp=$registo['improvedArgID'];       //criação de array uni-dimensional com os ID's das questões que sofreram edição
					array_push($ids, $temp);
				}

				$conn->disconnect($result);
				return $ids;
			}
				
		}catch(Exception $e){
			$e->getMessage();
		}

	}

	/**
	 * Method that returns the info about all arguments of a group that haven't been edited 
	 * @param integer $groupID
	 * @param integer $projectID
	 * @throws Exception
	 * @return array
	 */
	public function getNoEditedArgInfo($groupID, $projectID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select improvedArgID, improvedArg, dateHour, argType from impArg where groupID='$groupID' and projectID='$projectID' and edited='0' and state=1");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro ao obter os argumentos inseridos");
		}

		try{
				
			$num=mysql_num_rows($result);

			if($num>0){
				$info=array();
				while($registo=mysql_fetch_array($result)){
					array_push($info, $registo);
				}

					
				$conn->disconnect($result);
				return $info;
			}else{
				$conn->disconnect($result);
				return '';
			}
				
		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Returns the number of active (not deleted by users) arguments inserted by a certain group, in a certain project, 
	 * in the diad stage
	 * @param integer $groupID
	 * @throws Exception
	 * @return integer
	 */
	public function getNumberOfArgs($groupID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select improvedArgID from impArg where groupID='$groupID' and state=1");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro");
		}

		try{
			$num=mysql_num_rows($result);
			$conn->disconnect($result);
			return $num;

		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Method used to unset a certain argument. Used when a group wants to delete an argument
	 * @param integer $argID
	 * @throws Exception
	 * @return bool
	 */
	public function unsetArg($argID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("update impArg set state=0 where improvedArgID=$argID");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro");
		}

		try{
			$conn->disconnect($result);
			return true;
		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Method that returns the info about all groups that haven't been edited
	 * This is used in the stage of argument discussion
	 * @param integer $projectID
	 * @throws Exception
	 * @return array
	 */
	public function getAllNoEditedFromProject($projectID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select * from impArg where edited='0' and projectID='$projectID' order by dateHour desc");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro ao carregar os argumentos dos grupos");
		}

		try{
			$num=mysql_num_rows($result);

			if($num>0){
				$info=array();
				while($registo=mysql_fetch_array($result)){
					array_push($info, $registo);
				}

					
				$conn->disconnect($result);
				return $info;
			}else{
				$conn->disconnect($result);
				return '';
			}

		}catch(Exception $e){
			$e->getMessage();
		}

	}

	/**
	 * Method that returns the IDs of all arguments that have been edited
	 * This is used in the stage of argument discussion
	 * @param integer $projectID
	 * @throws Exception
	 * @return array
	 */
	public function getAllEditedIDSFromProject($projectID){

		/*
		 * Método que retorna os IDs de todos os argumentos dos grupos que sofreram edição num dado
		 * projeto;
		 * útil para a fase de discussão de argumentos, em que todos têm de ser carregados;
		 */

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select improvedArgID from impArg where edited=1 and projectID=$projectID order by dateHour desc");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro");
		}

		try{
				
			$info=array();

			while($registo=mysql_fetch_array($result)){
				array_push($info, $registo['improvedArgID']);
			}

				
			$conn->disconnect($result);
			return $info;

		}catch(Exception $e){
			$e->getMessage();
		}

	}
	
	/**
	 * Method that get a argument ID and returns the group ID that saved that argument
	 * @param integer $argID
	 * @throws Exception
	 * @return integer
	 */
	public function getGroupID($argID){
		
		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select groupID from impArg where improvedArgID=$argID");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro ao adquirir este elemento");
		}

		try{
				
			$registo=mysql_fetch_array($result);
			$conn->disconnect($result);
			return $registo['groupID'];
				
		}catch(Exception $e){
			$e->getMessage();
		}
		
	}

	/**
	 * Method that returns an array with info properly formatted for the project administrator, with arguments, 
	 * edited and unedited from each group in a certain project
	 * @param integer $groupID
	 * @param integer $projectID
	 * @throws Exception
	 * @return array
	 */
	public function preparedArrayForAdmin($groupID, $projectID){

		$conn=new ConnDBUser();
		$conn->connect();

		$result=mysql_query("select * from impArg where groupID=$groupID and projectID=$projectID");

		if(!$result){
			throw new Exception("Lamentamos mas ocorreu um erro ao obter as questões do grupo");
		}

		try{

			$firstArray=array();
			while($registo=mysql_fetch_array($result)){
				array_push($firstArray, $registo);
			}

			$conn->disconnect($result);

			//agora que já temos um array com todas as funções, vamos passá-lo por um método privado, que trata da verificação da existencia de edições
			$arrayFinal=$this->tuneAdminArray($firstArray);
			return $arrayFinal;

		}catch(Exception $e){
			$e->getMessage();
		}
	}

	/**
	 * Method that completes the array of the method preparedArrayForAdmin
	 * @param array $array
	 * @return array
	 */
	private function tuneAdminArray($array){
		/*
		 *
		 * Método privado que acrescenta ao array das perguntas dos grupos as respetivas edições
		 */

		$cleanArray=array();

		for($i=0; $i<count($array); $i++){

			if($array[$i]['edited']==1){

				//se for editado, vamos  buscar todas as versões:
				$edImpArg=new EdImpArg('', '', '');
				$tempArray=$edImpArg->showPreviousVersionsOfArg($array[$i]['improvedArgID']);
				unset($edImpArg);
				$cleanArray=array_merge($cleanArray, $tempArray);
			}else{
				$tempArray=array("arg" => $array[$i]['improvedArg'], "argType" => $array[$i]['argType'], "dateHour" => $array[$i]['dateHour'], "state" => $array[$i]['state'], "groupID" => $array[$i]['groupID'], "edited" => 0, "instance" => 0, "bold" => 1, "origArgID" => $array[$i]['improvedArgID']);
				array_push($cleanArray, $tempArray);
			}

		}

		return $cleanArray;
	}

}